Cyclostationary signatures of measured signals

Looking at the Spectral Correlation Function (SCF) of some of the signals recorded with the USRP.


In [1]:
sys.path.append("..")
from sensing.utils import fam

In [2]:
from PIL import Image

def imshow2(x, *args, **kwargs):
    
    ax = gca()
    fig = gcf()
    
    bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
    w = bbox.width * fig.dpi
    h = bbox.height * fig.dpi
    
    if x.shape[0] > h or x.shape[1] > w:
        x2 = asarray(Image.fromarray(x).resize((int(w), int(h)), Image.ANTIALIAS))
    else:
        x2 = x
        
    imshow(x2, *args, **kwargs)

In [3]:
def get_scf(path, Np):
    x = load(path)
    N = x.shape[0]/1000
    x0 = x[10*N:11*N]
    
    L = Np/4
    return fam(x0, Np, L)

In [4]:
def plot_scf(path, Np, fs):
    
    scf = get_scf(path, Np)
    scf[scf==0] = float('nan')
    
    # for printing
    #figure()
    ##imshow2(abs(scf), cmap='gray_r', aspect='auto', origin='lower', vmin=0, vmax=2.1e-9, extent=[-fs,fs,-.5*fs,.5*fs])
    #imshow2(abs(scf), cmap='jet', aspect='auto', origin='lower', vmin=0, vmax=2.1e-9, extent=[-fs,fs,-.5*fs,.5*fs])
    #grid(color='k')
    
    # for notebook
    figure(figsize=(10,8))
    imshow2(abs(scf), cmap='jet', aspect='auto', origin='lower', vmin=0, extent=[-fs,fs,-.5*fs,.5*fs])
    grid(color='w')
    cb = colorbar()
    #cb.set_label("linear scale")
    xlabel(r"$\alpha$ [MHz]")
    ylabel("$f$ [MHz]")

Internal USRP noise

Note changing scale.


In [5]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs1mhz_Ns25ks_off.npy", Np=256, fs=1)
title("SCF (USRP @ $f_s=1$MHz, $N_s=25$ksamples)");



In [6]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs2mhz_Ns25ks_off.npy", Np=256, fs=2)
title("SCF (USRP @ $f_s=2$MHz, $N_s=25$ksamples)");



In [7]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_off.npy", Np=256, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");


Central spot is due to low-frequency noise.


In [8]:
Np = 256
scf = get_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs1mhz_Ns25ks_off.npy", Np=Np)
N = scf.shape[1]/2
fs = 1.
f = fs * arange(-Np/2, Np/2) / Np
plot(f, abs(scf[:,N]))
title("Power Spectral Density (USRP @ $f_s=1$MHz, $N_s=25$ksamples)");
xlabel("$f$ [MHz]")
grid()


Microphone simulation (soft speaker)

Note symmetrical frequency scale, due to a real signal (imaginary part is zero).


In [9]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs1mhz_Ns25ks_m71_0dbm.npy", Np=256, fs=1)
title("$S_x(\\alpha, f)$ (USRP @ $f_s=1$MHz, $N_s=25$ksamples)");
#savefig("scf-example.eps")


Out[9]:
<matplotlib.text.Text at 0x7fc0c67abd50>

In [10]:
Np = 512
scf = get_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs1mhz_Ns25ks_m71_0dbm.npy", Np=Np)
N = scf.shape[1]/2

figure(figsize=(10,8))
imshow2(abs(scf[Np/2:,N/2:3*N/2]), aspect='auto', origin='lower', vmin=0, extent=[-.5*fs,.5*fs,0,.5*fs])
grid(color='w')
cb = colorbar()
cb.set_label("linear scale")
xlabel(r"$\alpha$ [MHz]")
ylabel("$f$ [MHz]")
title("SCF (USRP @ $f_s=1$MHz, $N_s=25$ksamples)");



In [11]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs2mhz_Ns25ks_m71_0dbm.npy", Np=256, fs=2)
title("SCF (USRP @ $f_s=2$MHz, $N_s=25$ksamples)");



In [12]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_m71_0dbm.npy", Np=256, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");


Effect of $N'$

$N'$ sets frequency resolution.


In [13]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_m71_0dbm.npy", Np=256, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");



In [14]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_m71_0dbm.npy", Np=128, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");



In [15]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_m71_0dbm.npy", Np=64, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");



In [16]:
plot_scf("../samples-usrp_campaign_mic2/usrp_micsoft_fs10mhz_Ns100ks_m71_0dbm.npy", Np=32, fs=10)
title("SCF (USRP @ $f_s=10$MHz, $N_s=100$ksamples)");



In [16]: